import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np
import os
import matplotlib as mpl
from matplotlib.font_manager import FontProperties

# 设置中文字体支持
try:
    plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'WenQuanYi Micro Hei', 'STXihei']
    plt.rcParams['axes.unicode_minus'] = False
    print("中文支持已启用")
except:
    print("中文支持设置失败，将使用英文")

# 读取Excel文件
file_path = 'E:/M/MathModel/23国赛C题/ds/附件5.xlsx'
sale = pd.read_excel(file_path, sheet_name='合并')
print("数据读取成功！总记录数:", len(sale))

# 转换日期格式
sale['销售日期'] = pd.to_datetime(sale['销售日期'])

# 定义蔬菜类别
categories = ['花菜类', '花叶类', '辣椒类', '茄类', '食用菌', '水生根茎类']
# 颜色
colors = ['#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b']

# 创建日期范围
start_date = sale['销售日期'].min()
end_date = sale['销售日期'].max()
date_range = pd.date_range(start=start_date, end=end_date, freq='D')
print(f"日期范围: {start_date.strftime('%Y-%m-%d')} 至 {end_date.strftime('%Y-%m-%d')}")
print(f"总天数: {len(date_range)}")

# 创建保存图表的目录
save_dir = 'E:/M/MathModel/23国赛C题/ds/销售分析图'
os.makedirs(save_dir, exist_ok=True)


# 画每个类型的图
for category in categories:
    plt.figure(figsize=(16, 8))

    # 筛选当前类别的数据
    category_data = sale[sale['分类名称'] == category]

    if category_data.empty:
        print(f"警告: 类别 '{category}' 没有找到数据! 跳过此类别")
        continue

    print(f"\n处理类别: {category}")
    print(f"记录数: {len(category_data)}")

    daily_sales = category_data.groupby('销售日期')['销量(千克)'].sum().reset_index()

    # 确保所有日期都在数据中（填充缺失日期）
    daily_sales = daily_sales.set_index('销售日期').reindex(date_range).fillna(0).reset_index()
    daily_sales.columns = ['销售日期', '总销量(千克)']

    # 绘制柱状图
    color = colors[categories.index(category)]
    bars = plt.bar(daily_sales['销售日期'], daily_sales['总销量(千克)'],
                   width=0.8, color=color, alpha=0.8)

    # 设置标题和标签
    plt.title(f'{category}每日销售量变化趋势', fontsize=20)
    plt.xlabel('日期', fontsize=14)
    plt.ylabel('销售量(千克)', fontsize=14)

    # 设置X轴日期格式和间隔
    plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

    # 根据总天数动态设置间隔
    total_days = len(daily_sales)
    interval = total_days // 15  # 总天数/15
    plt.gca().xaxis.set_major_locator(mdates.DayLocator(interval=interval))

    plt.xticks(rotation=45, ha='right', fontsize=12)
    plt.yticks(fontsize=12)

    # 添加网格线
    plt.grid(True, linestyle='--', alpha=0.3)

    # 添加平均线
    avg_sales = daily_sales['总销量(千克)'].mean()
    plt.axhline(avg_sales, color='r', linestyle='--', linewidth=2,
                label=f'平均销量: {avg_sales:.2f}千克')

    # 添加图例
    plt.legend(fontsize=12)

    # 添加数据标签（每（总天数/15）天显示一个）
    max_value = daily_sales['总销量(千克)'].max()
    label_offset = max_value * 0.05  # 标签位置偏移量

    for j in range(0, len(daily_sales), interval):
        if j < len(daily_sales):
            date = daily_sales['销售日期'].iloc[j]
            sales_value = daily_sales['总销量(千克)'].iloc[j]

            # 确保标签位置合理
            label_height = sales_value + label_offset

            plt.text(date, label_height, f'{sales_value:.1f}',
                     fontsize=10, ha='center', rotation=45)

    # 调整布局并保存
    plt.tight_layout()
    category_save_path = os.path.join(save_dir, f'{category}每日销售量.png')
    plt.savefig(category_save_path, dpi=300, bbox_inches='tight')
    plt.close()
    print(f"已保存 {category} 的图表: {category_save_path}")

print("\n所有图表生成完成！")
